#include <iostream>

using namespace std;
/*
    1. 什么是函数重载??
        C++允许在同一作用域中声明几个功能类似的同名函数，
        这些同名函数的形参列表(参数个数 或 类型 或 顺序)必须不同,才能构成函数重载

*/

/*
    2. C++是如何支持函数重载的？？
        C++ 之所以能够支持函数重载，主要依赖于编译器在编译阶段的符号修饰机制。符号修饰规则：  _Z 函数名长度 函数名 类型首字母
        在 C++ 中，多个同名函数如果参数类型或参数个数不同，即可构成函数重载。
        但在编译为机器码之前，所有的函数名都会被编译器转换为唯一的符号（函数签名），写入符号表中，这是为了解决链接阶段的符号冲突问题。
    具体过程：
        编译器在处理每个函数时，不仅记录函数名，还会将其参数类型、个数等信息编码进函数名中，生成一个独一无二的“修饰名”（Mangled Name）。
        链接器处理的是编译器生成的符号名（即修饰后的名称），由于重载函数已经具有不同的修饰名，所以不会在符号表中冲突，也不会发生重定位歧义，从而实现了函数重载的支持
        
*/

// 1. 函数参数个数不同
void print()
{
    cout << "print()" << endl;
}
extern "C" void print(int a)
{
    cout << "print(int a)" << endl;
}
// extern "C" void print(int a)    // 这样就是告诉编译器不用使用c++的名字修饰方式
// {
//     cout << "print(int a)" << endl;
// }

// 2. 参数类型不同
void print(double a)
{
    cout << "print(double a)" << endl;
}

// 3. 参数顺序不同
void print(int a, double b)
{
    cout << "print(int a, double b)" << endl;
}
void print(double b, int a)
{
    cout << "print(double a, int b)" << endl;
}

int mian()
{
}